package com.zhangbo.study.designpatternlearning.template;

/**
 * 模板方法父对象，定义了一些公共实现逻辑的方法和一个公共的算法模板方法
 */
public abstract class CaffeineBeverage {

    /**
     * 模板方法：固定的算法/业务顺序执行不同的方法
     */
    public final void prepareRecipe() {
        boilWater();
        brew();
        pourIncup();
        if(hook()) {
            addCondiments();
        }
    }

    /**
     * 子类的差异方法，由子类自己实现
     */
    protected abstract void brew();

    /**
     * 子类的差异方法，由子类自己实现
     */
    protected abstract void addCondiments();

    /**
     * 勾子方法，提供默认实现，子类可以进行覆盖而改变模板方法中的一定特定行为
     * @return
     */
    public boolean hook() {
        return true;
    }

    /**
     *模板方法中的公共实现，由父类实现且子类不可更改
     */
    private void boilWater() {
        System.out.println("烧开水");
    }

    /**
     *模板方法中的公共实现，由父类实现且子类不可更改
     */
    private void pourIncup() {
        System.out.println("把水倒入杯子");
    }


}
